'use strict';
var db = uniCloud.database(); // 全局数据库引用
var _ = db.command; // 数据库操作符
var $ = _.aggregate; // 聚合查询操作符
const addRefundReward = require('../util/addRefundReward');

module.exports = {
	/**
	 * 订单退款后的奖励扣除逻辑
	 * @param {Object} taskInfo  任务信息
	 * @param {Object} orderInfo 订单信息
	 * @param {Object} userInfo 下单人信息
	 * @param {Object} mchInfo 商家配置信息
	 */
	run: async (data) => {
		let res = { code: 0, msg: "ok" };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			taskInfo, //  任务信息
			orderInfo, // 订单信息
			userInfo, // 下单人信息
			mchInfo, // 商家配置信息
		} = data;

		let {
			order_no, // 订单号
		} = orderInfo;
		let {
			out_refund_no, // 退款单号
		} = taskInfo;

		// 根据退款单号获取退款信息
		let refundInfo = await vk.daoCenter.orderRefundDao.findByWhereJson({ out_refund_no });
		// 获取本次退款的商品信息（数量）
		let {
			goods_list: refund_goods_list, // 退款商品列表
			refund_amount: total_refund_amount, // 退款金额
			refund_express_amount = 0, // 退款运费金额
		} = refundInfo;

		// 存放最终扣除奖励的列表
		let usersRewardList = [];
		// 查询该订单发放的返佣记录
		let rewardRecList = await vk.daoCenter.rewardRecDao.listByNo({
			no: order_no,
			add_type: 7
		});
		// 循环返佣记录，进行扣除奖励
		for (let i = 0; i < rewardRecList.length; i++) {
			let rewardItem = rewardRecList[i];
			let {
				goods_reward_list: original_goods_reward_list
			} = rewardItem; // 该奖励记录对应的商品明细
			let refundGoodsRewardList = []; // 该记录的退款商品数据列表
			let sumUserReward = 0; // 该记录合计扣除奖励金额
			for (let j = 0; j < original_goods_reward_list.length; j++) {
				let originalGoodsRewardItem = original_goods_reward_list[j];
				let {
					sku_id,
					reward_value, // 该商品产生的奖励
					refund_reward_value = 0, // 已退款的奖励金额,不能大于reward_value
				} = originalGoodsRewardItem;
				// 获取本次退款金额和退款数量
				let refundGoodsItem = vk.pubfn.getListItem(refund_goods_list, "sku_id", sku_id);
				if (!refundGoodsItem) {
					// 如果该商品没有退款,则跳过
					continue;
				}
				// 退款金额和退款数量
				let {
					refund_amount, // 本次退款金额
					refund_num, // 本次退款数量
					payment_amount, // 商品原本付款金额
					buy_num, // 商品原本的购买数量
					buy_info, // 商品原本的购买详细信息
				} = refundGoodsItem;
				let goodsReward = {
					sku_id: buy_info.sku_id, // skuid
					goods_id: buy_info.goods_id, // 商品id
					should_payment_amount: payment_amount, // 商品付款金额
					buy_num, // 购买数量
					refund_amount, // 退款金额
					refund_num, // 退款数量
					reward_value: 0, // 扣除奖励金额（分为单位）
					reward_value_format: 0, // 扣除奖励金额（元为单位）
					reward_formula: "", // 扣除计算公式（元为单位）
				};
				// 需要扣除的佣金 = 该商品退款金额 / 订单里对应的该商品付款金额 * 该商品对应的返佣金额 ,向上取整
				goodsReward.reward_value = Math.ceil(refund_amount / payment_amount * reward_value);
				// 注意，如果多次部分退款，由于精度问题，可能会有0.01的偏差，为了解决偏差，最后一次退款需要特殊处理
				let maxRefundRewardValue = reward_value - refund_reward_value; // 本次该商品最大扣除奖励 = 发放奖励 - 已扣除奖励
				if (goodsReward.reward_value > maxRefundRewardValue) {
					goodsReward.reward_value = maxRefundRewardValue;
				}
				goodsReward.reward_value_format = vk.pubfn.toDecimal(goodsReward.reward_value / 100, 2);
				goodsReward.reward_formula = `${vk.pubfn.toDecimal(refund_amount / 100,2)} / ${vk.pubfn.toDecimal(payment_amount / 100,2)} * ${vk.pubfn.toDecimal(reward_value / 100,2)}`;
				refundGoodsRewardList.push(goodsReward);
				sumUserReward += goodsReward.reward_value;
				// 原记录已退款的奖励金额 = 原记录已退款的奖励金额 + 本次扣除金额
				original_goods_reward_list[j].refund_reward_value = refund_reward_value + goodsReward.reward_value;
			}
			usersRewardList.push({
				reward_id: rewardItem._id,
				original_goods_reward_list,
				user_id: rewardItem.user_id,
				user_id2: rewardItem.user_id2,
				reward_value: vk.pubfn.toDecimal(sumUserReward, 0),
				reward_value_format: vk.pubfn.toDecimal(sumUserReward / 100, 2), // 该用户总奖励（以元为单位）
				goods_reward_list: refundGoodsRewardList,
				reward_type: rewardItem.reward_type,
				reward_type_lv: rewardItem.reward_type_lv,
				// 同时判断记录是否已冻结中，如果冻结中，则同样扣冻结中的佣金（记录中解锁时间要一致），如果已解锁，则扣除已解锁的佣金
				is_freeze: rewardItem.is_freeze,
				unfreeze_time: rewardItem.unfreeze_time,
				calc_rule: {
					calc_amount: vk.pubfn.toDecimal(rewardItem.value / 100, 2), // 付款金额，去除运费
					reward_value: vk.pubfn.toDecimal(sumUserReward / 100, 2),
					k: sumUserReward > 0 ? vk.pubfn.toDecimal(sumUserReward / rewardItem.value, 6) : 0,
				}
			});
		}

		// 打印奖励日志
		let sumUsersReward = 0;
		usersRewardList.map((item, index) => {
			console.log(`用户【${item.user_id}】扣除奖励：${item.reward_value_format} 元`);
			sumUsersReward += item.reward_value;
		});

		let total_refund_goods_amount = total_refund_amount - refund_express_amount; // 去除运费
		console.log(`本次退款金额（不含运费）：${vk.pubfn.toDecimal(total_refund_goods_amount / 100, 2)} 元，共扣除奖励：${vk.pubfn.toDecimal(sumUsersReward / 100, 2)} 元，占比：${vk.pubfn.toDecimal(sumUsersReward / total_refund_goods_amount * 100, 6)}%`);
		console.log('usersRewardList: ', usersRewardList)

		// 执行扣除奖励
		res = await addRefundReward({
			taskInfo, //  任务信息
			orderInfo, // 订单信息
			userInfo, // 下单人信息
			mchInfo, // 商家配置信息
			usersRewardList, // 用户奖励扣除列表
			refundInfo, // 退款单信息
		});

		// 业务逻辑结束-----------------------------------------------------------
		return res;
	}
}
